[Momento Cache] compression機能をつかってデータのGet/Setをしてみる [Rust]
Introduction
Momentoはこのblogで何度か紹介している、
クラウドネイティブな各種サーバレスサービスです。
そして、このあたりにもあるように、
いろいろなプログラミング言語でSDKが提供されています。
その中でRust用SDKも用意されているのですが、
v0.32でデータのSet/Get時にデータを圧縮する機能が実装されていました。
おもしろそうなので、Rust用SDKでMomento Cache(データキャッシュ機能)の
compress機能を試してみます。
Environment
- MacBook Pro (13-inch, M1, 2020)
- OS : MacOS 13.5.2(Orb:ubuntu23)
- Rust : 1.72.1
Setup
Momentoの設定
まずはMomentoキャッシュと認証トークンを作成します。
Momento Consoleにアクセスしましょう。
アカウントがまだないならここでSignupしてログインします。
ログインしたら、キャッシュ一覧からキャッシュ作成を選択し、
キャッシュ名を記述してクラウドプロバイダーとリージョンを指定します。
次に、トークンのページにアクセスして、
先ほど作成したキャッシュのアクセス権限を持つ
Fine-Grained Access Tokenを生成します。
「トークンを生成する」ボタンをクリックするとトークンが生成されるので、
Auth Tokenを環境変数に設定しておきましょう。
% export MOMENTO_TOKEN="<Auth Token>"
Rust Projectの設定
Cargoを使ってRustプロジェクトを作成します。
% cargo new momento_rust && cd momento_rust
Cargo.tomlに依存ライブラリを追加します。
[dependencies] momento = "0.32.1" tokio = { version = "1.18.2", features = ["full"] }
Try
MomentoへアクセスするためにSimpleCacheClientを作成します。
use momento::{CredentialProviderBuilder, SimpleCacheClient, SimpleCacheClientBuilder}; #[tokio::main] async fn main() { let auth_token = String::from("MOMENTO_TOKEN"); let credential_provider = CredentialProviderBuilder::from_environment_variable(auth_token) .build() .expect("env var MOMENTO_TOKEN must be set to your auth token"); let mut cache_client: SimpleCacheClient = SimpleCacheClientBuilder::new(credential_provider, Duration::from_secs(30)) .unwrap() .build(); ・ ・ ・ }
クライアントを作成したら、Momentoへのアクセスが可能です。
通常のSet/Getは↓のようになります。
// Set cache_client .set(<キャッシュ名>, <キー>, <値>, None) .await .unwrap(); // Get let result_get: Get = cache_client .get(<キャッシュ名>, <キー>) .await .expect("get error!"); let result : MomentoResult<String> = result_get.try_into();
圧縮機能を使ったGet/Set
次に、圧縮処理を行ってからキャッシュをGet/Setする機能を使ってみます。
内部ではzstdクレートを使って圧縮を行っています。
違いはset_with_compression/get_with_decompressionを使うところだけ。
// Set with Compression cache_client .set_with_compression(<キャッシュ名>, <キー>, <値>, None) .await .unwrap(); // Get with Compression let result_get = cache_client .get_with_decompression(<キャッシュ名>, <キー>) .await .expect("get error!"); let result : MomentoResult<String> = result_get.try_into()
動作確認と計測
実際にcompressionあり・なしで500KBのデータをSet/Getしてみました。
送受信データを確認してみると、圧縮することで20%ほどサイズが少なくなっています。
送信データ | 受信データ | 合計 | |
---|---|---|---|
圧縮あり | 430KB | 441KB | 871KB |
圧縮なし | 518KB | 530KB | 1.05MB |
処理時間も測定。こちらは圧縮なしだと20%ほど速くなります。
Get | Set | |
---|---|---|
圧縮あり | 116.7ms | 123.4ms |
圧縮なし | 84.1ms | 90.8ms |
Summary
Momento Rust SDKをつかって圧縮Get/Setをやってみました。
速さとデータサイズはトレードオフになっているので、
要件にあったほうをつかいましょう。